home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-06 / logcopy.zip / LOG&COPY.ASM < prev    next >
Assembly Source File  |  1992-08-03  |  11KB  |  534 lines

  1. ;N
  2.     TITLE    LOGCOPY - NETWORK LOGGING AND COPY LIMITING UTILITY
  3.  
  4. CODE    SEGMENT PARA PUBLIC 'CODE'
  5.     ASSUME CS:CODE
  6.  
  7. CSTART:
  8.     JMP    INITIALIZE
  9. ;-----------------------------------------------------------------------
  10. EVEN
  11. INT_21        DD
  12. PSP        DW
  13. ;-----------------------------------------------------------------------
  14. SAVE_AX        DW
  15. SAVE_SS        DW
  16. SAVE_SP        DW
  17. SAVE_FLAGS    DW
  18. DRVTBL        DD
  19. SERVTBL        DD
  20. ;-----------------------------------------------------------------------
  21. REQ        DW    00FFH    ; PACKET SIZE INTEL FORMAT
  22. FUNC        DB    0DH    ; LOG NETWORK MESSAGE FUNCTION: 0DH (13d)
  23. STRLEN        DB    0
  24. OPCODE        DB    '@'
  25. LETTER        DB    0
  26. FILLER        DB    ' '    ; WHITE SPACE
  27. DUMMY        DB    0
  28. ;-----------------------------------------------------------------------
  29. EVEN
  30. REPLY        DW    0    ; PACKET SIZE INTEL FORMAT
  31. ;-----------------------------------------------------------------------
  32. SSTART        DB    800H DUP(0)
  33. SEND        DW    0
  34. STACK        DW    OFFSET SEND
  35. ;-----------------------------------------------------------------------
  36. REQUEST        DW    0
  37. ;-----------------------------------------------------------------------
  38. LOGGED        DB    0
  39. DONTLOG        DB    0
  40. DEFLOGACTION    DB    0FFH
  41. PREFERED    DB    0
  42. ;-----------------------------------------------------------------------
  43. FILENAME    DB    '^:LOG©.DAT',00H
  44. PATHREQ        DB    0EH,00,13H,00,'^',0AH,'SYS:PUBLIC'
  45. PATHREPLY    DB    02,00,00,00
  46. ;-----------------------------------------------------------------------
  47. MYNAME        DB    00H,02H,0CH,'LOG©.EXE'
  48. EVEN
  49. LIST0        DW    OFFSET MYNAME
  50. LIST        DW    800H DUP(0)
  51. ;-----------------------------------------------------------------------
  52. INUSE    DB    0DH,0AH
  53.     DB    'All Copies are currently in use. Press any key to'
  54.     DB    ' continue',0DH,0AH,'$'
  55. NAMSG    DB    0DH,0AH
  56.     DB    'Not attached to correct Server for this program.'
  57.     DB    ' Press any key to continue',0DH,0AH,'$'
  58. ;-----------------------------------------------------------------------
  59. PROGRAM    DB    'LOG©',0
  60. AUTHOR    DB    'by Keith P Robison',0
  61. NOTICE    DB    'Copyright Syracuse University 1988',0
  62. VERSION    DB    'VeRsIoN=LOG© Version 3.00 by Keith P. Robison',0
  63. ;=======================================================================
  64.  
  65. INITIALIZE:
  66.  
  67.     MOV    AX,DS
  68.     MOV    PSP,AX    ; SAVE PSP IN CASE WE NEED IT LATER
  69. ;-----------------------------------
  70.     MOV    AX,CS
  71.     MOV    DS,AX
  72.     CALL    LOAD_DATA
  73. ;----------------------------------- Get Drive and Server table address
  74.     MOV    AH,0EFH
  75.     MOV    AL,01H
  76.     INT    21H
  77.     MOV    DI,OFFSET DRVTBL
  78.     MOV    [DI],SI
  79.     INC    DI
  80.     INC    DI
  81.     MOV    [DI],ES
  82.     MOV    AH,0EFH
  83.     MOV    AL,04H
  84.     INT    21H
  85.     MOV    DI,OFFSET SERVTBL
  86.     MOV    [DI],SI
  87.     INC    DI
  88.     INC    DI
  89.     MOV    [DI],ES
  90. ;----------------------------------- Save current Interupt 21h in INT_21
  91.     MOV    AH,35H
  92.     MOV    AL,21H
  93.     INT    21H
  94.     MOV    DI,OFFSET INT_21
  95.     MOV    [DI],BX
  96.     INC    DI
  97.     INC    DI
  98.     MOV    [DI],ES
  99. ;----------------------------------- Set Interupt 21h to INT_PROC
  100.     MOV    DX,OFFSET INT_PROC
  101.     MOV    AH,25H
  102.     MOV    AL,21H
  103.     INT    21H
  104. ;----------------------------------- Terminate and Stay Resident
  105.     MOV    AH,31H
  106.     MOV    AL,1
  107.     MOV    DX,OFFSET CEND
  108.     SUB    DX,OFFSET CSTART
  109.     ADD    DX,101H    ; 100 FOR PSP 1 FOR ADJUST
  110.     MOV    CX,4
  111.     SHR    DX,CL
  112.     INC    DX
  113.     INT    21H
  114.  
  115. ;=======================================================================
  116.  
  117. INT_PROC    PROC FAR
  118.     PUSHF
  119.     CMP    AH,4BH
  120.     JZ    EXEC
  121.  
  122. QUIT:    POPF
  123.     JMP    DWORD PTR [INT_21]
  124.  
  125. EXEC:
  126.     CMP    AL,0
  127.     JNZ    QUIT
  128. ;---------------------------------------
  129.     MOV    DONTLOG,0H
  130. ;---------------------------------------
  131.     CLI
  132.     MOV    SAVE_AX,AX
  133.     POP    AX
  134.     MOV    SAVE_FLAGS,AX
  135.     MOV    SAVE_SS,SS
  136.     MOV    SAVE_SP,SP
  137.     MOV    AX,CS
  138.     MOV    SS,AX
  139.     MOV    SP,STACK
  140.     STI
  141. ;---------------------------------------
  142.     SUB    SP,004EH
  143.     MOV    REQUEST,SP
  144.     SUB    SP,0002H
  145. ;---------------------------------------
  146.     PUSH    SAVE_SS
  147.     PUSH    SAVE_SP
  148.     PUSH    DS
  149.     PUSH    ES
  150.     PUSH    DI
  151.     PUSH    SI
  152.     PUSH    DX
  153.     PUSH    CX
  154.     PUSH    BX
  155.     PUSH    BP
  156. ;--------------------------------------- Set up Reply buffer
  157.     XOR    AX,AX
  158.     MOV    REPLY,AX
  159. ;--------------------------------------- Set up request buffer
  160.     PUSH    DS        ; Save Original DS
  161.     MOV    AX,CS
  162.     MOV    DS,AX
  163.     MOV    ES,AX
  164.     MOV    SI,OFFSET REQ
  165.     MOV    DI,[REQUEST]
  166.     MOV    CX,0004H
  167.     CLD
  168.     REP    MOVSW           ; Copy Setup info to buffer
  169. ;--------------------------------------- Set DONTLOG to default value
  170.     MOV    AL,[DEFLOGACTION]
  171.     MOV    DONTLOG,AL
  172. ;---------------------------------------
  173.     POP    DS        ; Restore Original DS
  174. ;--------------------------------------- Store Program to request buffer
  175.     DEC    DI        ; DI is one more than start should be
  176.     MOV    SI,DX        ; Source Program name in DS:DX
  177.     XOR    CX,CX
  178. LOOP1:  INC    CX
  179.     MOVSB            ; Copy until a null is encountered
  180.     CMP    BYTE PTR [SI],0
  181.     JNZ    LOOP1
  182.     DEC    DI
  183.     MOV    BX,DI
  184.     INC    CX        ; Take into account extra chars
  185.     INC    CX
  186.     INC    CX
  187. ;--------------------------------------- Store String Length to buffer
  188.     MOV    AX,CS
  189.     MOV    DS,AX
  190.     MOV    SI,[REQUEST]
  191.     INC    SI
  192.     INC    SI
  193.     INC    SI
  194.     MOV    [SI],CL
  195. ;--------------------------------------- Set drive letter to N if network
  196.     MOV    CX,BX
  197.     MOV    DI,[REQUEST]
  198.     ADD    DI,0008H
  199.     MOV    AL,[DI]
  200.       CMP    AL,':'        ; IS FIRST CHARACTER A DRIVE LETTER ?
  201.     JNZ    NOTNETDRV    ; IF NOT DON'T DO SUBSTITUTION
  202.     DEC    DI
  203.     MOV    AL,[DI]
  204.     CLC
  205.     CMP    AL,'a'        ; CHECK TO SEE IF IT IS LOWERCASE
  206.     JC    UPPERCASE
  207.     SUB    AL,20H        ; MAKE lowercase INTO UPPERCASE
  208. UPPERCASE:
  209.     SUB    AL,'A'
  210.     CLC
  211.     CMP    AL,20H         ; IS IT OUTSIDE THE BOUNDS OF THE TABLE?
  212.     JNC    NOTNETDRV    ; YES SO DON'T DO SUBSTITUTION
  213.     PUSH    DS
  214.     LDS    BX,DRVTBL
  215.     XLAT
  216.     POP    DS
  217.     TEST    AL,03H
  218.     JZ    NOTNETDRV
  219.     MOV    AL,'N'
  220.     MOV    [DI],AL
  221. NOTNETDRV:
  222.     MOV    BX,CX
  223. ;--------------------------------------- Search through program list
  224.     MOV    DI,OFFSET LIST0
  225.     PUSH    DI
  226. SLIST:
  227.     POP    DI
  228.     MOV    SI,[DI]
  229.     OR    SI,SI
  230.     JNZ    SSKIP
  231.     JMP    LOGIT        ; NO MATCH SO LOGIT !
  232. SSKIP:
  233.     INC    DI
  234.     INC    DI
  235.     PUSH    DI
  236.     XOR    CX,CX
  237.     INC    SI
  238.     INC    SI
  239.     MOV    CL,[SI]
  240.     ADD    SI,CX
  241.     MOV    DI,BX
  242.     STD
  243. SCOMP:
  244.     CMPSB
  245.     JNZ    SLIST
  246.     LOOP    SCOMP
  247.     POP    DI
  248.     DEC    SI
  249.     MOV    AL,[SI]
  250.     DEC    SI
  251.     MOV    DONTLOG,0H
  252. DONTEXECUTCHECK:
  253.     TEST    AL,02H
  254.     JZ    DONTLOGCHECK
  255.     JMP    NOEXEC
  256. DONTLOGCHECK:
  257.     TEST    AL,01H
  258.     JZ    LIMITCHECK
  259.     MOV    DONTLOG,0FFH
  260. LIMITCHECK:
  261.     MOV    AL,[SI]
  262.     OR    AL,AL
  263.     JNZ    FINDSERVER    ; NON ZERO --- COPYLIMITED
  264.     JMP    LOGIT        ; ZERO NOT COPYLIMITED
  265. ;---------------------------------------
  266. FINDSERVER:
  267.     PUSH    AX        ; SAVE AX FOR COPYLIMIT
  268.     INC    SI
  269.     INC    SI        ; SI points to start of copylimit string
  270.     PUSH    SI        ; SAVE SI FOR LATER
  271.     MOV    AL,[SI]
  272.     XOR    AH,AH
  273.     ADD     SI,AX
  274.     INC    SI
  275.     MOV    AL,[SI]
  276.     OR    AL,AL
  277.     JZ    LIMITED        ; NO PREFERED SERVER FOR COPYLIMITING
  278.     XOR    CH,CH
  279.     MOV    CL,AL        ; CX HOLDS LENGTH OF TARGET SERVER
  280.     PUSH    ES        ; SAVE ES SO WE DON'T HAVE TO SET IT
  281.     LES    DI,SERVTBL
  282.     INC    SI
  283.     MOV    BX,SI        ; SAVE SI FOR LOOP
  284.         MOV    AX,DI        ; SAVE DI FOR LOOP
  285.     MOV    DX,1        ; DX IS SERVER# INITIALLY 1
  286.     CLD
  287. FSLOOP1:
  288.     PUSH    CX
  289.     REPZ    CMPSB
  290.     POP    CX
  291.     JZ    SETSERVER        ; A MATCH DX HOLDS SERVER #
  292.     ADD    AX,0030H        ; AX POINTS TO NEXT SERVER NAME
  293.     MOV    DI,AX
  294.     MOV    SI,BX
  295.     INC    DX            ; INCREMENT SERVER #
  296.     CMP    DL,09H
  297.     JC    FSLOOP1
  298.     MOV    DX,OFFSET NAMSG        ; NOT ATTACHED MESSAGE
  299.     POP    ES
  300.     POP    SI
  301.     POP    AX
  302.     JMP    MESSAGE            ; ISSUE MESSAGE AND EXIT
  303. SETSERVER:
  304.     POP    ES
  305.     MOV    PREFERED,DL
  306.     MOV    AX,0F000H
  307.     INT    21H
  308. ;---------------------------------------
  309. LIMITED:
  310.     POP    SI
  311.     POP    AX
  312.     CALL    COPYLIMIT
  313.     JNC    RESETSERVER
  314. ;--------------------------------------- RESET SERVER TO DEFAULT
  315.     MOV    DL,0
  316.     MOV    AX,0F000H
  317.     INT    21H
  318. ;--------------------------------------- LOG ALL COPIES IN USE
  319.     MOV    SI,[REQUEST]
  320.     MOV    DI,SI
  321.     ADD    DI,0004H
  322.     MOV    BYTE PTR [DI],'%'
  323.     INC    DI
  324.     MOV    BYTE PTR [DI],'%'
  325.     MOV    DI,OFFSET REPLY
  326.     MOV    AH,0E3H
  327.     INT    21H
  328. ;--------------------------------------- SET UP FOR MESSAGE
  329.     MOV    DX,OFFSET INUSE
  330. ;--------------------------------------- ISSUE MESSAGE AND WAIT FOR KEY
  331. MESSAGE:
  332.     MOV    AH,09H
  333.     INT    21H
  334.     MOV    AH,08H
  335.     INT    21H
  336. ;--------------------------------------- RELOAD DATA FILE AND EXIT
  337. NOEXEC:
  338.     CALL    LOAD_DATA
  339.     MOV    SAVE_AX,0000H           ; set RC to be 0
  340.     PUSH    SAVE_FLAGS
  341.     POPF
  342.         CLC                ; signal everthing ok
  343.     PUSHF
  344.         POP    SAVE_FLAGS
  345.     JMP    EXIT2
  346. ;---------------------------------------
  347. RESETSERVER:
  348.     MOV    DL,0
  349.     MOV    AX,0F000H
  350.     INT    21H
  351. ;---------------------------------------
  352. LOGIT:
  353.     TEST    DONTLOG,0FFH
  354.     JNZ    EXIT
  355.     INC    LOGGED
  356.     CMP    LOGGED,1
  357.     JNZ    EXIT
  358.     MOV    SI,[REQUEST]
  359.     MOV    DI,SI
  360.     ADD    DI,0005H
  361.     MOV    BYTE PTR [DI],'S'
  362.     MOV    DI,OFFSET REPLY
  363.     MOV    AH,0E3H
  364.     INT    21H
  365. ;---------------------------------------
  366. EXIT:
  367.     XOR    AH,AH
  368.     MOV    AL,DONTLOG
  369.     PUSH    AX        ; SAVE DONTLOG FOR LATER
  370.     PUSH    [REQUEST]
  371.     MOV    CS:STACK,SP
  372. ;---------------------------------------
  373.     CLI
  374.     ADD    SP,0004
  375.     POP    BP
  376.     POP    BX
  377.     POP    CX
  378.     POP    DX
  379.     POP    SI
  380.     POP    DI
  381.     POP    ES
  382.     POP    DS
  383.     MOV    SS,SAVE_SS
  384.     MOV    SP,SAVE_SP
  385.     MOV    AX,SAVE_FLAGS
  386.     PUSH    AX            ; INSTEAD OF PUSHF ... FOR INT
  387.     MOV    AX,SAVE_AX
  388. ;---------------------------------------
  389.     CALL DWORD PTR [INT_21]        ; CALL ORIGINAL INT 21 ROUTINE
  390. ;---------------------------------------
  391.     CLI
  392.     MOV    SAVE_AX,AX
  393.     PUSHF
  394.     POP    AX
  395.     MOV    SAVE_FLAGS,AX
  396.     MOV    AX,CS
  397.     MOV    SS,AX
  398.     MOV    SP,STACK
  399.     STI
  400. ;---------------------------------------
  401.     MOV    AX,CS
  402.     MOV    DS,AX
  403.     MOV    ES,AX
  404.     POP    SI
  405.     POP    AX
  406.     TEST    AL,0FFH
  407.     JNZ    EXIT2
  408.     DEC    LOGGED
  409.     TEST    LOGGED,0FFH
  410.     JNZ    EXIT2
  411. ;---------------------------------------
  412. LOGIT2:
  413.     MOV    DI,SI
  414.     ADD    DI,0005H
  415.     MOV    AX,SAVE_FLAGS
  416.     PUSH    AX
  417.     POPF
  418.     JNC    OK
  419.     MOV    BYTE PTR [DI],'F'
  420.     JNZ    DOIT2
  421. OK:    MOV    BYTE PTR [DI],'E'
  422. DOIT2:    MOV    DI,OFFSET REPLY
  423.     MOV    AH,0E3H
  424.     INT    21H
  425. ;---------------------------------------
  426. EXIT2:
  427.     POP    BP
  428.     POP    BX
  429.     POP    CX
  430.     POP    DX
  431.     POP    SI
  432.     POP    DI
  433.     POP    ES
  434.     POP    DS
  435.        POP    SAVE_SP
  436.     POP    SAVE_SS
  437.     ADD    SP,0050H
  438.     MOV    CS:STACK,SP
  439.     MOV    SP,SAVE_SP
  440.     MOV    SS,SAVE_SS
  441.     MOV    AX,SAVE_FLAGS
  442.     PUSH    BP
  443.     MOV    BP,SP
  444.     MOV    [BP+6],AX
  445.     POP    BP
  446.     MOV    AX,SAVE_AX
  447.     IRET
  448. ;---------------------------------------
  449.  
  450. INT_PROC    ENDP
  451.  
  452. ;=======================================================================
  453. COPYLIMIT    PROC    NEAR    ; SI POINTS TO SEMAPHORE
  454.     MOV    AH,0
  455.     PUSH    AX        ; SAVE NUMBER OF COPIES;
  456.     MOV    DX,SI        ; DX POINTS TO SEMAPHORE
  457.     MOV    CL,0        ; INITIAL SEMAPHORE VALUE
  458.     MOV    AX,0C500H    ; OPEN A SEMPHORE CALL
  459.     INT    21H        ; DO IT
  460.     TEST    AL,0FFH
  461.     JNZ    CERROR
  462.     POP    AX
  463.     CMP    AL,BL
  464.     RET
  465. CERROR:                ; FOR ERRORS ACT AS IF EVERTHING IS OK
  466.     CLC
  467.     RET
  468. COPYLIMIT    ENDP
  469. ;=======================================================================
  470. LOAD_DATA    PROC NEAR
  471.  
  472.     ;-------------------------------- Set up temporary drive letter
  473.         PUSH    ES
  474.     MOV    AX,CS
  475.     MOV    ES,AX
  476.     MOV    SI,OFFSET PATHREQ
  477.     MOV    DI,OFFSET PATHREPLY
  478.     MOV    AH,0E2H
  479.     INT    21H
  480.         TEST    AL,0FFH
  481.     JNZ    FERROR
  482.     ;--------------------------------  Open and read file
  483.     MOV    DX,OFFSET FILENAME
  484.     MOV    AL,00000000B        ; COMPATIBLITY MODE READ ACCESS
  485.     MOV    AH,03DH
  486.     INT    21H
  487.     JC    FERROR
  488.     MOV    BX,AX               ; BX HOLDS FILE HANDLE
  489.     MOV    CX,1H            ; Read 1 byte for default
  490.     MOV    DX,OFFSET DEFLOGACTION ; loggin action
  491.     MOV    AH,03FH
  492.     INT    21H
  493.     MOV    CX,1000H        ; READ MAXIMUM OF 4K BYTES
  494.     MOV    DX,OFFSET LIST
  495.     MOV    AH,03FH
  496.     INT    21H
  497.     JC    FCLOSE
  498.     MOV    SI,OFFSET LIST
  499.     MOV    CX,SI
  500. FLOOP:
  501.     MOV    AX,[SI]
  502.     TEST    AX,0FFFFH
  503.     JZ    FCLOSE
  504.     ADD    AX,CX
  505.     MOV    [SI],AX
  506.     INC    SI
  507.     INC    SI
  508.     JMP    FLOOP
  509. FCLOSE:
  510.     MOV    AH,03EH        ; CLOSE THE FILE
  511.     INT    21H
  512.     ;-------------------------------- Remove temp drive
  513.     MOV    SI,OFFSET PATHREPLY
  514.     MOV    DI,OFFSET PATHREPLY
  515.     MOV    AL,[SI+2]
  516.     MOV    [SI+3],AL
  517.     MOV    AL,14H
  518.     MOV    [SI+2],AL
  519.     MOV    AL,0E2H
  520.     INT    21H
  521.     ;--------------------------------  Exit routine
  522. FERROR:
  523.     POP    ES
  524.     RET
  525.  
  526. LOAD_DATA    ENDP
  527. ;=======================================================================
  528. CEND:
  529.  
  530. CODE    ENDS
  531.  
  532. END CSTART
  533. ;O
  534.